Ergebnisse Bundestagswahl 2021

Cédric Scherer https://cedricscherer.com , Ansgar Wolsing
2021-10-04

Setup

pacman::p_load("tidyverse", "here", "glue", "colorspace", "sf", "geojson", "pdftools")

Daten

Tile Grid Map

grid <- read_csv(here("data", "de_constituencies_grid.csv")) %>% 
  mutate(id_num = as.numeric(id))

Ergebnisse Bundestagswahl 2021

Source:

btw_raw <- read_csv(here("data", "btw21_DieZeit.csv"))

btw_clean <- btw_raw %>% 
  mutate(
    winner_de = case_when(
      party == "CDU" ~ "CDU",
      party == "SPD" ~ "SPD",
      party == "Grüne" ~ "Bündnis 90/Die Grünen",
      party == "FDP" ~ "FDP",
      party == "AfD" ~ "AfD",
      party == "Linke" ~ "Die Linke",
      party == "CSU" ~ "CSU",
      TRUE ~ "Andere"
    ),
    winner_en = case_when(
      party == "Grüne" ~ "Alliance 90/The Greens",
      party == "Linke" ~ "The Left",
      winner_de == "Andere" ~ "Other",
      TRUE ~ winner_de
    ),
    winner_de = factor(winner_de, levels = c("SPD", "CDU", "CSU", "Bündnis 90/Die Grünen", 
                                              "FDP", "AfD", "Die Linke", "Andere")),
    winner_en = factor(winner_en, levels = c("SPD", "CDU", "CSU", "Alliance 90/The Greens", 
                                              "FDP", "AfD", "The Left", "Other"))
  )
btw_first <- 
  btw_clean %>% 
  group_by(electoral_id) %>%
  arrange(-first_percent, -first_absolute) %>% 
  slice(1:2) %>% 
  mutate(rank = row_number()) %>% 
  dplyr::select(electoral_id, first_percent, winner_de, winner_en, rank) %>% 
  pivot_wider(
    id_cols = c(electoral_id),
    names_from = rank,
    values_from = c(first_percent, winner_de, winner_en)
  ) %>% 
  mutate(
    winner_first_de = winner_de_1,
    winner_first_en = winner_en_1,
    follow_first_de = winner_de_2,
    follow_first_en = winner_en_2,
    winner_first_percent = first_percent_1,
    follow_first_percent = first_percent_2,
    difference_first_percent = first_percent_1 - first_percent_2
  ) %>% 
  dplyr::select(-ends_with("_1"), -ends_with("_2"))
btw_second <- 
  btw_clean %>% 
  group_by(electoral_id) %>%
  arrange(-second_percent, -second_absolute) %>% 
  slice(1:2) %>% 
  mutate(rank = row_number()) %>% 
  dplyr::select(electoral_id, second_percent, winner_de, winner_en, rank) %>% 
  pivot_wider(
    id_cols = c(electoral_id),
    names_from = rank,
    values_from = c(second_percent, winner_de, winner_en)
  ) %>% 
  mutate(
    winner_second_de = winner_de_1,
    winner_second_en = winner_en_1,
    follow_second_de = winner_de_2,
    follow_second_en = winner_en_2,
    winner_second_percent = second_percent_1,
    follow_second_percent = second_percent_2,
    difference_second_percent = second_percent_1 - second_percent_2
  ) %>% 
  dplyr::select(-ends_with("_1"), -ends_with("_2"))

Kombinierte Datensätze

grid_btw <- 
  grid %>% 
  left_join(btw_first, by = c("id_num" = "electoral_id")) %>% 
  left_join(btw_second, by = c("id_num" = "electoral_id"))

Setup Tile Maps

theme_set(theme_void(base_family = "Noto Serif")) #Editorial New, Noto Serif
theme_update(legend.margin = margin(0, 10, 0, 25),
             legend.title = element_text(size = 16, margin = margin(15, 0, 1, 0),
                                         family = "Chivo", face = "bold"),
             legend.text = element_text(size = 16, margin = margin(5, 0, 5, -2.5),
                                        family = "Chivo"),
             plot.title = element_text(hjust = .5, face = "bold", size = 28,
                                       lineheight = 1.1, margin = margin(t = 10, b = 20)),
             plot.subtitle = element_text(hjust = .5, color = "grey33", size = 16,
                                          margin = margin(t = -15, b = 18)),
             plot.title.position = "plot",
             plot.caption = element_text(hjust = 0, color = "grey33", 
                                         lineheight = 1.3,
                                         size = 12, margin = margin(20, 0, 5, 5)),
             plot.caption.position = "plot",
             plot.margin = margin(10, 0, 10, 0))

# Party colors
party_colors <- c("SPD" = "#ca0002", ##"#E3000F",  a bit darker now to make it work better with CVD
                  "CDU" = "#212121", 
                  "CSU" = "#4e4e6d", ## grey33, #464662
                  "Bündnis 90/Die Grünen" = rgb(100, 161, 45, maxColorValue = 255),
                  "FDP" = darken("#ffed00", 0.1),
                  "AfD" = rgb(0, 158, 224, maxColorValue = 255),
                  "Die Linke" = "purple",
                  "Andere" = "grey74")

party_colors_first <- party_colors[c(1, 2, 3, 4, 6, 7)]
party_colors_second <- party_colors[c(1, 2, 3, 4, 6)]

parties_first_en <- c("SPD", "CDU", "CSU", "Alliance 90/The Greens", "AfD", "The Left")
parties_second_en <- c("SPD", "CDU", "CSU", "Alliance 90/The Greens", "AfD")

title_de <- "Ergebnisse der Bundestagswahl 2021"
title_en <- "Results of the German National Election 2021"

caption_de <- "Grafik: Cédric Scherer & Ansgar Wolsing • Daten: DIE ZEIT"
caption_en <- "Graphic: Cédric Scherer & Ansgar Wolsing • Source: DIE ZEIT"

Erststimme

g <-  
  ggplot(grid_btw, aes(col, row)) +
  coord_fixed() +
  scale_x_continuous(limits = c(-.5, max(grid$col) + 4)) +
  scale_y_reverse(expand = c(.03, .03)) +
  scale_color_manual(values = party_colors_first, name = NULL) +
  scale_fill_manual(values = party_colors_first, name = NULL) +
  guides(color = guide_legend(override.aes = list(size = 6)),
         fill = guide_legend(override.aes = list(size = 6))) +
  theme(legend.position = c(.82, .27))

Erststimme — Gewinner

subtitle_first_de <- "Die stärksten Parteien nach Erststimmen."
subtitle_first_en <- "The winner parties by first votes."

Tile Grid Map

g_tile_winner <- g +
  geom_point(
    aes(color = winner_first_de), 
    size = 11, shape = 15
  ) 

## Deutsche Version
g_tile_winner + labs(title = title_de, subtitle = subtitle_first_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_winner_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_winner + labs(title = title_en, subtitle = subtitle_first_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_first, name = NULL, labels = parties_first_en)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_winner_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_tile_winner_id <- g_tile_winner +
  geom_text(
    aes(label = id, color = winner_first_de, 
        color = after_scale(lighten(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold",
    show.legend = FALSE
  )
  # geom_text(
  #   aes(label = id),
  #   size = 3.2, family = "Chivo", 
  #   color = "#fefefe", fontface = "bold"
  # )

## Deutsche Version
g_tile_winner_id + labs(title = title_de, subtitle = subtitle_first_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_winner_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_winner_id + labs(title = title_en, subtitle = subtitle_first_en, caption = caption_en) +
  scale_color_manual(values = party_colors_first, name = NULL, labels = parties_first_en)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_winner_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Dot Map

g_dot_winner <- g +
  geom_point(aes(color = winner_first_de), size = 10) 

## Deutsche Version
g_dot_winner + labs(title = title_de, subtitle = subtitle_first_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_winner_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_winner + labs(title = title_en, subtitle = subtitle_first_en, caption = caption_en) +
  scale_color_manual(values = party_colors_first,
                     name = NULL, labels = parties_first_en)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_winner_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_dot_winner_id <- g_dot_winner +
  geom_text(
    aes(label = id, color = winner_first_de, 
        color = after_scale(lighten(color, .35))),
    size = 3.1, family = "Chivo", fontface = "bold",
    show.legend = FALSE
  )

## Deutsche Version
g_dot_winner_id + labs(title = title_de, subtitle = subtitle_first_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_winner_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_winner_id + labs(title = title_en, subtitle = subtitle_first_en, caption = caption_en) +
  scale_color_manual(values = party_colors_first, name = NULL, labels = parties_first_en)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_winner_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Variante mit gedämpfteren Farben für die Füllung der Punkte

g_dot_winner_light <- g +
  geom_point(
    aes(fill = winner_first_de), 
    size = 8.6, shape = 21, stroke = 1.4, alpha = .5, color = "transparent"
  ) +
  geom_point(
    aes(color = winner_first_de), 
    size = 8.6, shape = 21, stroke = 1.4, fill = "transparent"
  ) +
  guides(color = guide_legend(override.aes = list(size = 5.5)))

## Deutsche Version
g_dot_winner_light + labs(title = title_de, subtitle = subtitle_first_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_winner_de_light.pdf"), width = 10, height = 11.7, device = cairo_pdf)
 
## Englische Version
g_dot_winner_light + labs(title = title_en, subtitle = subtitle_first_en, caption = caption_en) +
  scale_color_manual(values =party_colors_first,
                     name = NULL, labels = parties_first_en) +
  scale_fill_manual(values = party_colors_first,
                    name = NULL, labels = parties_first_en)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_winner_en_light.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Hexagon Tiles

## READ GEOMETRY ==============================================
#' https://pitchinteractiveinc.github.io/tilegrams/
#' Download geometry "Germany - Constituencies" as TopoJSON
#' and place it in the data directory
filepath_topo <- here("data", "tiles.topo.json")
wk_topo <- geojsonio::topojson_read(filepath_topo)
wk_topo <- wk_topo %>% mutate(id = as.numeric(id))

# Merge shapes of constituencies into state-level shapes 
bland_shape <- wk_topo %>% 
  inner_join(grid_btw, by = c("id" = "id_num")) %>% 
  group_by(bundesland_de) %>% 
  summarize(geometry = st_union(geometry))

Hexbin Map

g_hex <- grid_btw %>% 
  inner_join(wk_topo, by = c("id_num" = "id")) %>% 
  ggplot(aes(geometry = geometry)) +
  geom_sf(
    aes(fill = winner_first_de),
    size = .3, col = "grey85"
  ) +
  geom_sf_text(
    aes(label = id, color = winner_first_de, 
        color = after_scale(lighten(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold",
    show.legend = FALSE
  ) +
  geom_sf(
    data = bland_shape,
    aes(geometry = geometry, 
        group = bundesland_de),
    fill = NA, col = "#fefefe",
    size = 2.3, show.legend = FALSE
  ) +
  geom_sf(
    aes(fill = winner_first_de),
    size = .5, fill = NA, col = "grey85",
  ) +
  scale_x_continuous(expand = c(.1, .1)) +
  scale_y_continuous(expand = c(.01, .01)) +
  scale_color_manual(values = party_colors_first, guide = "none") +
  scale_fill_manual(values = party_colors_first, name = NULL) +
  guides(fill = guide_legend(override.aes = list(size = 0.25))) +
  theme(legend.position = c(.16, .92),
        legend.key.size = unit(5, "mm"))

## Deutsche Version
g_hex + 
  labs(title = title_de, subtitle = subtitle_first_de,
       caption = glue("{caption_de}\nTilegram-Geometrie: pitchinteractiveinc.github.io"))
ggsave(here("plots", "btw21", "first-votes", "btw21_hexagon_map_first_winner_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_hex + 
  labs(title = title_en, subtitle = subtitle_first_en,
       caption = glue("{caption_en}\nTilegram-Geometrie: pitchinteractiveinc.github.io")) +
  scale_fill_manual(values = party_colors_first,
                    name = NULL, labels = parties_first_en)
ggsave(here("plots", "btw21", "first-votes", "btw21_hexagon_map_first_winner_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Erststimme — Vorsprung

Tile Grid Map

subtitle_first_diff_de <- "Die stärksten Parteien nach Erststimmen und Vorsprung zur zweitplatzierten Partei."
subtitle_first_diff_en <- "The winner parties by first votes and lead over the second-placed party."
g_tile_diff <- g +
  geom_point(
    aes(color = winner_first_de, alpha = difference_first_percent), 
    size = 11, shape = 15
  ) +
  scale_x_continuous(limits = c(-.5, max(grid$col) + 4.5)) +
  scale_alpha(range = c(.25, 1), name = "Vorsprung:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 8, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 8), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_tile_diff + labs(title = title_de, subtitle = subtitle_first_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_diff_de.pdf"), width = 10, height = 11.3, device = cairo_pdf)

## Englische Version
g_tile_diff + labs(title = title_en, subtitle = subtitle_first_diff_en, caption = caption_en) +
  scale_color_manual(values = party_colors_first, name = NULL, labels = parties_first_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_diff_en.pdf"), width = 10, height = 11.3, device = cairo_pdf)

mit Wahlkreisnummern

g_tile_diff_id <- g_tile_diff +
  geom_text(
    data = filter(grid_btw, difference_first_percent > 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(lighten(color, .65))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, difference_first_percent <= 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(darken(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_tile_diff_id + 
  labs(title = title_de, subtitle = subtitle_first_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_diff_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_diff_id + 
  labs(title = title_en, subtitle = subtitle_first_diff_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_first, name = NULL, labels = parties_first_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_diff_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Dot Map

g_dot_diff <- g +
  geom_point(
    aes(color = winner_first_de, alpha = difference_first_percent), 
    size = 8.6, shape = 16
  ) +
  geom_point(
    aes(color = winner_first_de), 
    size = 8.6, shape = 21, stroke = 1.4, fill = "transparent", show.legend = FALSE
  ) +
  scale_alpha(range = c(.25, .85), name = "Vorsprung:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 6, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 6), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_dot_diff + 
  labs(title = title_de, subtitle = subtitle_first_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_diff_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_diff + 
  labs(title = title_en, subtitle = subtitle_first_diff_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_first,
                    name = NULL, labels = parties_first_en) +
  scale_alpha(range = c(.25, .85), name = "Vorsprung:", labels = scales::percent_format(scale = 1)) 
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_diff_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_dot_diff_id <- g_dot_diff +
  geom_text(
    data = filter(grid_btw, difference_first_percent > 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(lighten(color, .65))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, difference_first_percent <= 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(darken(color, .35))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_dot_diff_id + 
  labs(title = title_de, subtitle = subtitle_first_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_diff_de_id.pdf"), width = 10, height = 12, device = cairo_pdf)

## Englische Version
g_dot_diff_id + 
  labs(title = title_en, subtitle = subtitle_first_diff_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_first, name = NULL, labels = parties_first_en)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_diff_en_id.pdf"), width = 10, height = 12, device = cairo_pdf)

Erststimme — Votes

Tile Grid Map

subtitle_first_votes_de <- "Die stärksten Parteien nach Prozent der Erststimmen."
subtitle_first_votes_en <- "The winner parties by percentage of first votes."
g_tile_diff <- g +
  geom_point(
    aes(color = winner_first_de, alpha = winner_first_percent), 
    size = 11, shape = 15
  ) +
  scale_x_continuous(limits = c(-.5, max(grid$col) + 4.5)) +
  scale_alpha(range = c(.25, 1), name = "Erststimmen:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 8, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 8), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_tile_diff + labs(title = title_de, subtitle = subtitle_first_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_votes_de.pdf"), width = 10, height = 11.3, device = cairo_pdf)

## Englische Version
g_tile_diff + labs(title = title_en, subtitle = subtitle_first_votes_en, caption = caption_en) +
  scale_color_manual(values = party_colors_first, name = NULL, labels = parties_first_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_votes_en.pdf"), width = 10, height = 11.3, device = cairo_pdf)

mit Wahlkreisnummern

g_tile_diff_id <- g_tile_diff +
  geom_text(
    data = filter(grid_btw, winner_first_percent > 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(lighten(color, .65))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, winner_first_percent <= 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(darken(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_tile_diff_id + 
  labs(title = title_de, subtitle = subtitle_first_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_votes_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_diff_id + 
  labs(title = title_en, subtitle = subtitle_first_votes_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_first, name = NULL, labels = parties_first_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "first-votes", "btw21_tile_grid_map_first_votes_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Dot Map

g_dot_diff <- g +
  geom_point(
    aes(color = winner_first_de, alpha = winner_first_percent), 
    size = 8.6, shape = 16
  ) +
  geom_point(
    aes(color = winner_first_de), 
    size = 8.6, shape = 21, stroke = 1.4, fill = "transparent", show.legend = FALSE
  ) +
  scale_alpha(range = c(.25, .85), name = "Erststimmen:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 6, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 6), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_dot_diff + 
  labs(title = title_de, subtitle = subtitle_first_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_votes_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_diff + 
  labs(title = title_en, subtitle = subtitle_first_votes_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_first,
                    name = NULL, labels = parties_first_en) +
  scale_alpha(range = c(.25, .85), name = "Erststimmen:", labels = scales::percent_format(scale = 1)) 
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_votes_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_dot_diff_id <- g_dot_diff +
  geom_text(
    data = filter(grid_btw, winner_first_percent > 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(lighten(color, .65))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, winner_first_percent <= 15),
    aes(label = id, color = winner_first_de,
        color = after_scale(darken(color, .35))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_dot_diff_id + 
  labs(title = title_de, subtitle = subtitle_first_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_votes_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_diff_id + 
  labs(title = title_en, subtitle = subtitle_first_votes_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_first, name = NULL, labels = parties_first_en)
ggsave(here::here("plots", "btw21", "first-votes", "btw21_dot_grid_map_first_votes_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Zweitstimme

g <-  
  ggplot(grid_btw, aes(col, row)) +
  coord_fixed() +
  scale_x_continuous(limits = c(-.5, max(grid$col) + 4)) +
  scale_y_reverse(expand = c(.03, .03)) +
  scale_color_manual(values = party_colors_second, name = NULL) +
  scale_fill_manual(values = party_colors_second, name = NULL) +
  guides(color = guide_legend(override.aes = list(size = 6)),
         fill = guide_legend(override.aes = list(size = 6))) +
  theme(legend.position = c(.82, .27))

Zweitstimme — Gewinner

subtitle_second_de <- "Die stärksten Parteien nach Zweitstimmen."
subtitle_second_en <- "The winner parties by second votes."

Tile Grid Map

g_tile_winner <- g +
  geom_point(
    aes(color = winner_second_de), 
    size = 11, shape = 15
  ) 

## Deutsche Version
g_tile_winner + labs(title = title_de, subtitle = subtitle_second_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_winner_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_winner + labs(title = title_en, subtitle = subtitle_second_en, caption = caption_en) +
  scale_color_manual(values = party_colors_second, name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_winner_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)
g_true_tile_winner <- g +
  geom_tile(
    aes(fill = winner_second_de, color = after_scale(fill)), 
    size = 0
  ) 

## Deutsche Version
g_true_tile_winner + labs(title = title_de, subtitle = subtitle_second_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_winner_de_true.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_true_tile_winner + labs(title = title_en, subtitle = subtitle_second_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_second, name = NULL, labels = parties_second_en) +
  scale_color_manual(values = party_colors_second, name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_winner_en_true.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_tile_winner_id <- g_tile_winner +
  geom_text(
    aes(label = id, color = winner_second_de, 
        color = after_scale(lighten(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold",
    show.legend = FALSE
  )
  # geom_text(
  #   aes(label = id),
  #   size = 3.2, family = "Chivo", 
  #   color = "#fefefe", fontface = "bold"
  # )

## Deutsche Version
g_tile_winner_id + labs(title = title_de, subtitle = subtitle_second_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_winner_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_winner_id + labs(title = title_en, subtitle = subtitle_second_en, caption = caption_en) +
  scale_color_manual(values = party_colors_second, name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_winner_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Dot Map

g_dot_winner <- g +
  geom_point(aes(color = winner_second_de), size = 10) 

## Deutsche Version
g_dot_winner + labs(title = title_de, subtitle = subtitle_second_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_winner_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_winner + labs(title = title_en, subtitle = subtitle_second_en, caption = caption_en) +
  scale_color_manual(values = party_colors_second,
                     name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_winner_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_dot_winner_id <- g_dot_winner +
  geom_text(
    aes(label = id, color = winner_second_de, 
        color = after_scale(lighten(color, .35))),
    size = 3.1, family = "Chivo", fontface = "bold",
    show.legend = FALSE
  )

## Deutsche Version
g_dot_winner_id + labs(title = title_de, subtitle = subtitle_second_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_winner_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_winner_id + labs(title = title_en, subtitle = subtitle_second_en, caption = caption_en) +
  scale_color_manual(values = party_colors_second, name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_winner_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Variante mit gedämpfteren Farben für die Füllung der Punkte

g_dot_winner_light <- g +
  geom_point(
    aes(fill = winner_second_de), 
    size = 8.6, shape = 21, stroke = 1.4, alpha = .5, color = "transparent"
  ) +
  geom_point(
    aes(color = winner_second_de), 
    size = 8.6, shape = 21, stroke = 1.4, fill = "transparent"
  ) +
  guides(color = guide_legend(override.aes = list(size = 5.5)))

## Deutsche Version
g_dot_winner_light + labs(title = title_de, subtitle = subtitle_second_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_winner_de_light.pdf"), width = 10, height = 11.7, device = cairo_pdf)
 
## Englische Version
g_dot_winner_light + labs(title = title_en, subtitle = subtitle_second_en, caption = caption_en) +
  scale_color_manual(values =party_colors_second,
                     name = NULL, labels = parties_second_en) +
  scale_fill_manual(values = party_colors_second,
                    name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_winner_en_light.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Hexagon Tiles

Hexbin Map

g_hex <- grid_btw %>% 
  inner_join(wk_topo, by = c("id_num" = "id")) %>% 
  ggplot(aes(geometry = geometry)) +
  geom_sf(
    aes(fill = winner_second_de),
    size = .3, col = "grey85"
  ) +
  geom_sf_text(
    aes(label = id, color = winner_second_de, 
        color = after_scale(lighten(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold",
    show.legend = FALSE
  ) +
  geom_sf(
    data = bland_shape,
    aes(geometry = geometry, 
        group = bundesland_de),
    fill = NA, col = "#fefefe",
    size = 2.3, show.legend = FALSE
  ) +
  geom_sf(
    aes(fill = winner_second_de),
    size = .5, fill = NA, col = "grey85",
  ) +
 scale_x_continuous(expand = c(.1, .1)) +
  scale_y_continuous(expand = c(.01, .01)) +
  scale_color_manual(values = party_colors_second, guide = "none") +
  scale_fill_manual(values = party_colors_second, name = NULL) +
  guides(fill = guide_legend(override.aes = list(size = 0.25))) +
  theme(legend.position = c(.16, .92),
        legend.key.size = unit(5, "mm"))

## Deutsche Version
g_hex + 
  labs(title = title_de, subtitle = subtitle_second_de,
       caption = glue("{caption_de}\nTilegram-Geometrie: pitchinteractiveinc.github.io"))
ggsave(here("plots", "btw21", "second-votes", "btw21_hexagon_map_second_winner_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_hex + 
  labs(title = title_en, subtitle = subtitle_second_en,
       caption = glue("{caption_en}\nTilegram-Geometrie: pitchinteractiveinc.github.io")) +
  scale_fill_manual(values = party_colors_second,
                    name = NULL, labels = parties_second_en)
ggsave(here("plots", "btw21", "second-votes", "btw21_hexagon_map_second_winner_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Zweitstimme — Vorsprung

Tile Grid Map

subtitle_second_diff_de <- "Die stärksten Parteien nach Zweitstimmen und Vorsprung zur zweitplatzierten Partei."
subtitle_second_diff_en <- "The winner parties by second votes and lead over the second-placed party."
g_tile_diff <- g +
  geom_point(
    aes(color = winner_second_de, alpha = difference_second_percent), 
    size = 11, shape = 15
  ) +
  scale_x_continuous(limits = c(-.5, max(grid$col) + 4.5)) +
  scale_alpha(range = c(.25, 1), name = "Vorsprung:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 8, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 8), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_tile_diff + labs(title = title_de, subtitle = subtitle_second_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_diff_de.pdf"), width = 10, height = 11.3, device = cairo_pdf)

## Englische Version
g_tile_diff + labs(title = title_en, subtitle = subtitle_second_diff_en, caption = caption_en) +
  scale_color_manual(values = party_colors_second, name = NULL, labels = parties_second_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_diff_en.pdf"), width = 10, height = 11.3, device = cairo_pdf)

mit Wahlkreisnummern

g_tile_diff_id <- g_tile_diff +
  geom_text(
    data = filter(grid_btw, difference_second_percent > 13),
    aes(label = id, color = winner_second_de,
        color = after_scale(lighten(color, .65))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, difference_second_percent <= 13),
    aes(label = id, color = winner_second_de,
        color = after_scale(darken(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_tile_diff_id + 
  labs(title = title_de, subtitle = subtitle_second_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_diff_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_diff_id + 
  labs(title = title_en, subtitle = subtitle_second_diff_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_second, name = NULL, labels = parties_second_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_diff_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Dot Map

g_dot_diff <- g +
  geom_point(
    aes(color = winner_second_de, alpha = difference_second_percent), 
    size = 8.6, shape = 16
  ) +
  geom_point(
    aes(color = winner_second_de), 
    size = 8.6, shape = 21, stroke = 1.4, fill = "transparent", show.legend = FALSE
  ) +
  scale_alpha(range = c(.25, .85), name = "Vorsprung:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 6, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 6), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_dot_diff + 
  labs(title = title_de, subtitle = subtitle_second_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_diff_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_diff + 
  labs(title = title_en, subtitle = subtitle_second_diff_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_second,
                    name = NULL, labels = parties_second_en) +
  scale_alpha(range = c(.25, .85), name = "Vorsprung:", labels = scales::percent_format(scale = 1)) 
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_diff_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_dot_diff_id <- g_dot_diff +
  geom_text(
    data = filter(grid_btw, difference_second_percent > 12),
    aes(label = id, color = winner_second_de,
        color = after_scale(lighten(color, .65))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, difference_second_percent <= 12),
    aes(label = id, color = winner_second_de,
        color = after_scale(darken(color, .35))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_dot_diff_id + 
  labs(title = title_de, subtitle = subtitle_second_diff_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_diff_de_id.pdf"), width = 10, height = 12, device = cairo_pdf)

## Englische Version
g_dot_diff_id + 
  labs(title = title_en, subtitle = subtitle_second_diff_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_second, name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_diff_en_id.pdf"), width = 10, height = 12, device = cairo_pdf)

Zweitstimme — Votes

Tile Grid Map

subtitle_second_votes_de <- "Die stärksten Parteien nach Prozent der Zweitstimmen."
subtitle_second_votes_en <- "The winner parties by percentage of second votes."
g_tile_diff <- g +
  geom_point(
    aes(color = winner_second_de, alpha = winner_second_percent), 
    size = 11, shape = 15
  ) +
  scale_x_continuous(limits = c(-.5, max(grid$col) + 4.5)) +
  scale_alpha(range = c(.25, 1), name = "Zweitstimmen:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 8, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 8), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_tile_diff + labs(title = title_de, subtitle = subtitle_second_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_votes_de.pdf"), width = 10, height = 11.3, device = cairo_pdf)

## Englische Version
g_tile_diff + labs(title = title_en, subtitle = subtitle_second_votes_en, caption = caption_en) +
  scale_color_manual(values = party_colors_second, name = NULL, labels = parties_second_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_votes_en.pdf"), width = 10, height = 11.3, device = cairo_pdf)

mit Wahlkreisnummern

g_tile_diff_id <- g_tile_diff +
  geom_text(
    data = filter(grid_btw, winner_second_percent > 30),
    aes(label = id, color = winner_second_de,
        color = after_scale(lighten(color, .65))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, winner_second_percent <= 30),
    aes(label = id, color = winner_second_de,
        color = after_scale(darken(color, .35))),
    size = 3.2, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_tile_diff_id + 
  labs(title = title_de, subtitle = subtitle_second_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_votes_de_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_tile_diff_id + 
  labs(title = title_en, subtitle = subtitle_second_votes_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_second, name = NULL, labels = parties_second_en) +
  scale_alpha(range = c(.25, 1), name = "Lead:", labels = scales::percent_format(scale = 1))
ggsave(here::here("plots", "btw21", "second-votes", "btw21_tile_grid_map_second_votes_en_id.pdf"), width = 10, height = 11.7, device = cairo_pdf)

Dot Map

g_dot_diff <- g +
  geom_point(
    aes(color = winner_second_de, alpha = winner_second_percent), 
    size = 8.6, shape = 16
  ) +
  geom_point(
    aes(color = winner_second_de), 
    size = 8.6, shape = 21, stroke = 1.4, fill = "transparent", show.legend = FALSE
  ) +
  scale_alpha(range = c(.25, .85), name = "Zweitstimmen:", labels = scales::percent_format(scale = 1)) +
  guides(color = guide_legend(override.aes = list(size = 6, alpha = .7), order = 1),
         alpha = guide_legend(override.aes = list(size = 6), order = 2)) +
  theme(legend.position = c(.83, .2))

## Deutsche Version
g_dot_diff + 
  labs(title = title_de, subtitle = subtitle_second_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_votes_de.pdf"), width = 10, height = 11.7, device = cairo_pdf)

## Englische Version
g_dot_diff + 
  labs(title = title_en, subtitle = subtitle_second_votes_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_second,
                    name = NULL, labels = parties_second_en) +
  scale_alpha(range = c(.25, .85), name = "Zweitstimmen:", labels = scales::percent_format(scale = 1)) 
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_votes_en.pdf"), width = 10, height = 11.7, device = cairo_pdf)

mit Wahlkreisnummern

g_dot_diff_id <- g_dot_diff +
  geom_text(
    data = filter(grid_btw, winner_second_percent > 30),
    aes(label = id, color = winner_second_de,
        color = after_scale(lighten(color, .65))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  ) +
  geom_text(
    data = filter(grid_btw, winner_second_percent <= 30),
    aes(label = id, color = winner_second_de,
        color = after_scale(darken(color, .35))),
    size = 2.8, family = "Chivo", fontface = "bold", 
    show.legend = FALSE
  )

## Deutsche Version
g_dot_diff_id + 
  labs(title = title_de, subtitle = subtitle_second_votes_de, caption = caption_de)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_votes_de_id.pdf"), width = 10, height = 12, device = cairo_pdf)

## Englische Version
g_dot_diff_id + 
  labs(title = title_en, subtitle = subtitle_second_votes_en, caption = caption_en) +
  scale_fill_manual(values = party_colors_second, name = NULL, labels = parties_second_en)
ggsave(here::here("plots", "btw21", "second-votes", "btw21_dot_grid_map_second_votes_en_id.pdf"), width = 10, height = 12, device = cairo_pdf)

mit Wahlkreisnummern (Quadrate)

# TODO: Chart-Titel

char_arrow_up <-  "\u25B2"
char_arrow_down <-  "\u25BC"
char_level <- "-"

parties <- list(c("CDU", "CSU"), "SPD", "Grüne", "FDP", "AfD", "Linke")

for (party_selected in parties) {
  party_selected_color <- case_when(
    party_selected %in% c("CDU", "CSU") ~ "CDU",
    party_selected == "Grüne" ~ "Bündnis 90/Die Grünen",
    party_selected == "Linke" ~ "Die Linke",
    TRUE ~ party_selected
  )[1]
  
  g <- btw_clean %>% 
    filter(party %in% party_selected) %>% 
    select(electoral_id, name, party, second_percent, second_difference) %>% 
    mutate(second_difference_abs = abs(second_difference)) %>% 
    left_join(grid, by = c("electoral_id" = "id_num")) %>%  
    ggplot(aes(col, row)) +
    coord_fixed() +
    scale_x_continuous(limits = c(-.5, max(grid$col) + 4)) +
    scale_y_reverse(expand = c(.03, .03)) +
    scale_color_manual(values = party_colors_first, name = NULL) +
    scale_fill_manual(values = party_colors_first, name = NULL) +
    guides(color = guide_legend(override.aes = list(size = 6)),
           fill = guide_legend(override.aes = list(size = 6))) +
    theme(legend.position = c(.82, .27))
  
  g_tile_diff <- g +
    geom_point(
      aes(alpha = second_difference_abs), 
      color = party_colors[party_selected_color],
      size = 11, shape = 15
    ) +
    scale_x_continuous(limits = c(-.5, max(grid$col) + 4.5)) +
    scale_alpha(range = c(.25, 1), name = "Absolute Veränderung:", labels = scales::percent_format(scale = 1)) +
    guides(color = guide_legend(override.aes = list(size = 8, alpha = .7), order = 1),
           alpha = guide_legend(override.aes = list(size = 8), order = 2)) +
    theme(legend.position = c(.83, .2))
  
  g_tile_diff_sign <- g_tile_diff +
    geom_text(
      aes(label = case_when(
        second_difference > 0 ~ char_arrow_up,
        second_difference < 0 ~ char_arrow_down,
        is.na(second_difference) ~ "", # für die Grünen im Saarland
        TRUE ~ char_level),
          alpha = second_difference_abs),
      color = "white",
      size = 3.2, family = "Chivo", fontface = "bold", 
      show.legend = FALSE
    )
  
  ## Deutsche Version
  g_tile_diff_sign +
    labs(title = title_de, subtitle = subtitle_second_votes_de, caption = caption_de)
  
  ggsave(here::here("plots", "btw21", "second-votes", glue("btw21_tile_grid_map_second_trend_{party_selected[1]}_de.pdf")), 
         width = 10, height = 11.7, device = cairo_pdf)
  
  ## Englische Version
  g_tile_diff_sign + 
    labs(title = title_en, subtitle = subtitle_second_votes_en, caption = caption_en) +
    scale_fill_manual(values = party_colors_first, name = NULL, labels = parties_second_en) +
    scale_alpha(range = c(.25, 1), name = "Absolute Change:", labels = scales::percent_format(scale = 1))
  
   ggsave(here::here("plots", "btw21", "second-votes", glue("btw21_tile_grid_map_second_trend_{party_selected[1]}_en.pdf")), 
         width = 10, height = 11.7, device = cairo_pdf)
  
}  

mit Wahlkreisnummern (Quadrate, Symbole gefärbt)

# TODO: Chart-Titel

char_arrow_up <-  "\u25B2"
char_arrow_down <-  "\u25BC"
char_level <- "-"

parties <- list(c("CDU", "CSU"), "SPD", "Grüne", "FDP", "AfD", "Linke")


for (party_selected in parties) {
  party_selected_color <- case_when(
    party_selected %in% c("CDU", "CSU") ~ "CDU",
    party_selected == "Grüne" ~ "Bündnis 90/Die Grünen",
    party_selected == "Linke" ~ "Die Linke",
    TRUE ~ party_selected
  )[1]
  
  g <- btw_clean %>% 
    filter(party %in% party_selected) %>% 
    select(electoral_id, name, party, second_percent, second_difference) %>% 
    mutate(second_difference_abs = abs(second_difference)) %>% 
    left_join(grid, by = c("electoral_id" = "id_num")) %>%  
    ggplot(aes(col, row)) +
    coord_fixed() +
    scale_x_continuous(limits = c(-.5, max(grid$col) + 4)) +
    scale_y_reverse(expand = c(.03, .03)) +
    # scale_color_manual(values = party_colors_first, name = NULL) +
    scale_fill_manual(values = party_colors_first, name = NULL) +
    guides(color = guide_legend(override.aes = list(size = 6)),
           fill = guide_legend(override.aes = list(size = 6))) +
    theme(legend.position = c(.82, .27))
  
  g_tile_diff <- g +
    geom_point(
      aes(alpha = second_difference_abs), 
      color = party_colors[party_selected_color],
      size = 11, shape = 15
    ) +
    scale_x_continuous(limits = c(-.5, max(grid$col) + 4.5)) +
    scale_alpha(range = c(.25, 1), name = "Absolute Veränderung:", labels = scales::percent_format(scale = 1)) +
    guides(color = guide_legend(override.aes = list(size = 8, alpha = .7), order = 1),
           alpha = guide_legend(override.aes = list(size = 8), order = 2)) +
    theme(legend.position = c(.83, .2))
  
  g_tile_diff_sign <- g_tile_diff +
    geom_text(
      aes(label = case_when(
        second_difference > 0 ~ char_arrow_up,
        second_difference < 0 ~ char_arrow_down,
        is.na(second_difference) ~ "", # für die Grünen im Saarland
        TRUE ~ char_level),
        color = case_when(
        second_difference > 0 ~ "white",
        second_difference < 0 ~ "grey8"),
          alpha = second_difference_abs),
      size = 3.2, family = "Chivo", fontface = "bold", 
      show.legend = FALSE
    ) +
    scale_color_identity()
  
  ## Deutsche Version
  g_tile_diff_sign +
    labs(title = title_de, subtitle = subtitle_second_votes_de, caption = caption_de)
  
  ggsave(here::here("plots", "btw21", "second-votes", glue("btw21_tile_grid_map_second_trend_{party_selected[1]}_de.pdf")), 
         width = 10, height = 11.7, device = cairo_pdf)
  
  ## Englische Version
  g_tile_diff_sign + 
    labs(title = title_en, subtitle = subtitle_second_votes_en, caption = caption_en) +
    scale_fill_manual(values = party_colors_first, name = NULL, labels = parties_second_en) +
    scale_alpha(range = c(.25, 1), name = "Absolute Change:", labels = scales::percent_format(scale = 1))
  
   ggsave(here::here("plots", "btw21", "second-votes", glue("btw21_tile_grid_map_second_trend_{party_selected[1]}_en.pdf")), 
         width = 10, height = 11.7, device = cairo_pdf)
  
}  
pdfs <- list.files(here::here('plots', 'btw21'), pattern = "*.pdf", recursive = TRUE)
for(pdf in pdfs) {
  pdf_convert(pdf = glue::glue("{here::here('plots', 'btw21')}/{pdf}"), 
              filenames = glue::glue("{here::here('plots', 'btw21')}/{str_remove(pdf, '.pdf')}.png"),
              format = "png", dpi = 500)
}

Session Info
[1] "2021-10-04 23:08:54 CEST"
R version 4.1.0 (2021-05-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252   
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    
system code page: 65001

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
 [1] pdftools_3.0.1   geojson_0.3.4    sf_1.0-2        
 [4] colorspace_2.0-2 glue_1.4.2       here_1.0.1      
 [7] forcats_0.5.1    stringr_1.4.0    dplyr_1.0.7     
[10] purrr_0.3.4      readr_2.0.1      tidyr_1.1.3     
[13] tibble_3.1.4     ggplot2_3.3.5    tidyverse_1.3.1 

loaded via a namespace (and not attached):
 [1] fs_1.5.0           lubridate_1.7.10   bit64_4.0.5       
 [4] httr_1.4.2         rprojroot_2.0.2    tools_4.1.0       
 [7] backports_1.2.1    bslib_0.3.0        utf8_1.2.2        
[10] R6_2.5.1           KernSmooth_2.23-20 rgeos_0.5-8       
[13] DBI_1.1.1          lazyeval_0.2.2     withr_2.4.2       
[16] sp_1.4-5           tidyselect_1.1.1   downlit_0.2.1     
[19] curl_4.3.2         bit_4.0.4          compiler_4.1.0    
[22] textshaping_0.3.5  cli_3.0.0          rvest_1.0.1       
[25] pacman_0.5.1       geojsonsf_2.0.1    xml2_1.3.2        
[28] labeling_0.4.2     sass_0.4.0         scales_1.1.1      
[31] classInt_0.4-3     proxy_0.4-26       askpass_1.1       
[34] systemfonts_1.0.2  digest_0.6.28      foreign_0.8-81    
[37] rmarkdown_2.11     pkgconfig_2.0.3    htmltools_0.5.2   
[40] highr_0.9          dbplyr_2.1.1       fastmap_1.1.0     
[43] rlang_0.4.11       readxl_1.3.1       httpcode_0.3.0    
[46] rstudioapi_0.13    farver_2.1.0       jquerylib_0.1.4   
[49] generics_0.1.0     jsonlite_1.7.2     vroom_1.5.5       
[52] distill_1.2        magrittr_2.0.1     Rcpp_1.0.7        
[55] munsell_0.5.0      fansi_0.5.0        lifecycle_1.0.1   
[58] stringi_1.7.4      yaml_2.2.1         jqr_1.2.1         
[61] maptools_1.1-2     grid_4.1.0         parallel_4.1.0    
[64] geojsonio_0.9.4    crayon_1.4.1       lattice_0.20-44   
[67] haven_2.4.3        hms_1.1.1          knitr_1.34        
[70] pillar_1.6.3       crul_1.1.0         reprex_2.0.1      
[73] evaluate_0.14      V8_3.4.2           qpdf_1.1          
[76] modelr_0.1.8       vctrs_0.3.8        tzdb_0.1.2        
[79] cellranger_1.1.0   gtable_0.3.0       assertthat_0.2.1  
[82] xfun_0.26          broom_0.7.9        e1071_1.7-9       
[85] ragg_1.1.3         class_7.3-19       units_0.7-2       
[88] ellipsis_0.3.2